% !TeX root = ../exam-zh-doc-basic.tex

\section{创建题目}

本章详细介绍如何创建各种题型。掌握这些内容后，你就能制作大部分常见的试卷了。

\subsection{试卷抬头}

试卷抬头包括标题、科目、学生信息栏和注意事项等内容。

\subsubsection{标题和科目}

\begin{function}{\title,\subject,\maketitle}
  \begin{ccnusyntax}
    \title(*\marg{标题}*)
    \subject(*\oarg{宽度}\marg{科目}*)
    \maketitle
  \end{ccnusyntax}

  设置试卷标题和科目，使用 |\maketitle| 生成。
\end{function}

\begin{latexcode}[deletetexcs={\documentclass},morekeywords={\documentclass}]
  \documentclass{exam-zh}
  \begin{document}

  \title{2024年春季期中考试}
  \subject{数学}
  \maketitle

  % ... 题目内容
  \end{document}
\end{latexcode}

\textbf{说明：}
\begin{itemize}
  \item |\title| 设置主标题
  \item |\subject| 设置科目，可选参数 \meta{宽度} 控制科目文字分散对齐的宽度
  \item |\maketitle| 必须在设置标题和科目后使用，才能显示
\end{itemize}

\subsubsection{学生信息栏}

\begin{function}{\information}
  \begin{ccnusyntax}
    \information(*\oarg{分隔符}\marg{信息内容}*)
  \end{ccnusyntax}

  创建学生信息填写栏，默认分隔符为 |\quad|。
\end{function}

\begin{latexcode}
  \information{
    姓名\underline{\hspace{6em}},
    班级\underline{\hspace{6em}},
    座号\underline{\hspace{4em}}
  }
\end{latexcode}

\textbf{提示：}
\begin{itemize}
  \item 使用 |\underline{\hspace{长度}}| 创建填写下划线
  \item 常用长度单位：|em|（字符宽度）、|cm|（厘米）
  \item 可以用逗号、|\quad| 等分隔各项
\end{itemize}

\subsubsection{注意事项}

\begin{function}{notice 环境}
  \begin{ccnusyntax}
    \begin{notice}(*\oarg{选项}*)
      \item 注意事项1
      \item 注意事项2
    \end{notice}
  \end{ccnusyntax}

  创建注意事项列表，自动加粗标题。
\end{function}

\begin{latexcode}
  \begin{notice}
    \item 本试卷共 3 大题，满分 100 分。
    \item 考试时间 90 分钟。
    \item 请用黑色签字笔在答题卡上作答。
  \end{notice}
\end{latexcode}

\textbf{自定义标题：}

\begin{latexcode}
  \begin{notice}[label = {考生须知：}]
    \item ...
  \end{notice}
\end{latexcode}


\subsection{选择题}

选择题由 |question| 环境和 |choices| 环境组合使用。

\subsubsection{基本用法}

\begin{latexcode}
  \begin{question}
    下列哪个数是质数？\paren[B]
    \begin{choices}
      \item $4$
      \item $5$   % 正确答案
      \item $6$
      \item $8$
    \end{choices}
  \end{question}
\end{latexcode}

\textbf{关键点：}
\begin{enumerate}
  \item |\begin{question}...\end{question}| 创建题目
  \item |\paren[B]| 添加答案括号，|[B]| 表示正确答案是选项 B（默认隐藏）
  \item |\begin{choices}...\end{choices}| 创建选项列表
  \item 每个 |\item| 是一个选项，自动标号为 A、B、C、D...
\end{enumerate}

\subsubsection{显示分值}

默认情况下，题目分值是隐藏的。

\begin{latexcode}
  % 全局显示所有题目的分值
  \examsetup{
    question/show-points = true
  }

  \begin{question}[points = 5]
    题目内容...（本题5分）
  \end{question}
\end{latexcode}

\textbf{单独设置某题分值：}

\begin{latexcode}
  \begin{question}[points = 10]
    这道题10分...
  \end{question}
\end{latexcode}

\subsubsection{控制选项排列}

选项默认会自动排列成合适的列数。

\textbf{手动指定列数：}

\begin{latexcode}
  % 全局设置
  \examsetup{
    choices/columns = 2  % 所有选择题排成2列
  }

  % 单独设置某题
  \begin{choices}[columns = 4]  % 这题排成4列
    \item ...
  \end{choices}
\end{latexcode}

\textbf{强制单列（选项内容很长时）：}

\begin{latexcode}
  \begin{choices}[columns = 1]
    \item 这是一个很长的选项内容...
    \item 另一个很长的选项...
  \end{choices}
\end{latexcode}

\subsubsection{选项标签样式}

默认选项标签是 A、B、C、D...，可以自定义。

\begin{latexcode}
  % 使用数字标签
  \begin{choices}[label = \arabic*.]
    \item 选项1
    \item 选项2
  \end{choices}

  % 使用带圈数字
  \begin{choices}[label = \circlednumber*]
    \item 选项①
    \item 选项②
  \end{choices}
\end{latexcode}

\subsubsection{多选题}

多选题使用同样的方式，只是答案可以有多个。

\begin{latexcode}
  \begin{question}
    下列哪些数是质数？（多选）\paren[BD]
    \begin{choices}
      \item $4$
      \item $5$   % 正确答案之一
      \item $6$
      \item $7$   % 正确答案之一
    \end{choices}
  \end{question}
\end{latexcode}

\subsubsection{嵌套使用限制}

\textbf{问题：}|choices| 环境在某些情况下不能正常工作。

\textbf{限制 1：在深层嵌套列表中使用}

\begin{latexcode}
  % 错误：多层 enumerate 嵌套时 choices 可能错位
  \begin{question}
    \begin{enumerate}
      \item 第一问
        \begin{enumerate}
          \item 小问(a)：请选择...\paren[A]
            \begin{choices}  % 可能显示异常
              \item ...
            \end{choices}
        \end{enumerate}
    \end{enumerate}
  \end{question}
\end{latexcode}

\textbf{建议：}
\begin{itemize}
  \item 避免在两层及以上的 |enumerate| 嵌套中使用 |choices|
  \item 如需小问，将选择题放在最外层
  \item 或使用简单的文本列举：A. ... B. ... C. ... D. ...
\end{itemize}

\textbf{限制 2：与 wrapstuff 图文绕排冲突}

\begin{latexcode}
  % 错误：图片绕排后 choices 位置错乱
  \begin{question}
    \begin{wrapstuff}{0.3\textwidth}
      \includegraphics{fig.png}
    \end{wrapstuff}
    题目文字...\paren[A]
    \begin{choices}  % 会错位
      \item ...
    \end{choices}
  \end{question}
\end{latexcode}

\textbf{解决方案：}
\begin{enumerate}
  \item 使用 |minipage| 布局代替 |wrapstuff|
  \item 将图片放在 |choices| 环境之后
  \item 或将图片居中放置，不使用绕排
\end{enumerate}

详见"常见场景"章节的"图文混排详解"小节。

\textbf{限制 3：在 minipage 中使用}

在 |minipage| 环境中使用 |choices| 时可能出现宽度计算问题：

\begin{latexcode}
  % 可能需要手动指定列数
  \begin{minipage}{0.5\textwidth}
    \begin{question}
      题目...\paren[A]
      \begin{choices}[columns = 1]  % 手动指定单列
        \item ...
      \end{choices}
    \end{question}
  \end{minipage}
\end{latexcode}


\subsection{填空题}

填空题使用 |\fillin| 命令创建填空位置。

\subsubsection{基本用法}

\begin{latexcode}
  \begin{question}
    圆周率 $\uppi \approx$ \fillin[3.14]（保留两位小数）。
  \end{question}

  \begin{question}
    $1 + 1 = $ \fillin[2]。
  \end{question}
\end{latexcode}

\textbf{说明：}
\begin{itemize}
  \item |\fillin[答案]| 创建填空，答案默认隐藏
  \item 答案在 |\examsetup{question/show-answer = true}| 时显示
  \item 无答案时自动生成固定长度的下划线
\end{itemize}

\subsubsection{调整填空宽度}

\textbf{全局设置：}

\begin{latexcode}
  \examsetup{
    fillin/width = 4em  % 默认宽度
  }
\end{latexcode}

\textbf{单独设置：}

\begin{latexcode}
  % 这个填空特别长
  计算结果：\fillin[width = 8em][很长的答案内容]

  % 这个填空短一些
  答：\fillin[width = 2em][是]
\end{latexcode}

\subsubsection{特殊符号使用注意事项}

填空题答案中使用某些特殊符号时需要转义或特殊处理。

\textbf{方括号 |[]| 冲突：}

\begin{latexcode}
  % 错误：方括号会被解析为可选参数
  区间为 \fillin[[2,3)]

  % 正确：用花括号包裹
  区间为 \fillin[{$[2,3)$}]

  % 或使用星号变体
  区间为 \fillin*{$[2,3)$}
\end{latexcode}

\textbf{其他特殊符号：}

\begin{center}
\begin{tabular}{lll}
  \hline
  \textbf{符号} & \textbf{错误示例} & \textbf{正确写法} \\
  \hline
  百分号 |%| & |\fillin[50%]| & |\fillin[50\%]| \\
  美元符号 |\$| & |\fillin[$100]| & |\fillin[\$100]| \\
  和号 |&| & |\fillin[A&B]| & |\fillin[A\&B]| \\
  下划线 |_| & |\fillin[a_1]| & |\fillin[a\_1]| 或 |\fillin[$a_1$]| \\
  \hline
\end{tabular}
\end{center}

\textbf{数学符号答案：}

数学符号应该用数学模式：

\begin{latexcode}
  % 错误：数学符号直接写
  答案是 \fillin[x^2 + 1]

  % 正确：用 $ $ 包裹
  答案是 \fillin[$x^2 + 1$]
\end{latexcode}

\textbf{长答案问题：}

填空题下划线\textbf{不会自动换行}，答案过长会超出页面边界（Issue \#IAXE1N）：

\begin{latexcode}
  % 问题：答案太长会超出页面
  填空：\fillin[这是一个非常非常长的答案，可能会超出右边界]

  % 解决方案1：手动控制宽度
  填空：\fillin[width = 8em][长答案]

  % 解决方案2：分成多个填空
  前半：\fillin[答案1]，后半：\fillin[答案2]

  % 解决方案3：缩短答案文字
  填空：\fillin[简短答案]
\end{latexcode}

详见"已知问题与限制"章节。

\subsubsection{填空样式}

默认是下划线样式，可以改为括号或留白。

\begin{latexcode}
  % 全局设置为括号样式
  \examsetup{
    fillin/type = paren
  }

  答案在括号里：\fillin[答案]
\end{latexcode}

\textbf{可选样式：}
\begin{itemize}
  \item |line|（默认）：下划线 \fillin[答案]
  \item |paren|：括号 \fillin[type=paren][答案]
  \item |blank|：留白（无线）
\end{itemize}

\subsubsection{数学公式中的填空}

在数学环境中使用填空，注意语法：

\begin{latexcode}
  \begin{question}
    解方程：$x^2 - 5x + 6 = 0$，得 $x_1 = $ \fillin[2]，$x_2 = $ \fillin[3]。
  \end{question}

  \begin{question}
    化简：$(x + 1)^2 = $ \fillin[$x^2 + 2x + 1$]。
  \end{question}
\end{latexcode}

\textbf{提示：}数学公式答案直接写在 |\fillin| 的方括号中，会自动处理数学模式。


\subsection{解答题}

解答题使用 |problem| 环境和 |solution| 环境。

\subsubsection{基本结构}

\begin{latexcode}
  \begin{problem}[points = 10]
    计算：$(x + 1)^2$

    \begin{solution}
      解：

      $(x + 1)^2 = (x + 1)(x + 1)$

      $= x^2 + 2x + 1$

      答：$(x + 1)^2 = x^2 + 2x + 1$
    \end{solution}
  \end{problem}
\end{latexcode}

\textbf{说明：}
\begin{itemize}
  \item |problem| 环境创建解答题（类似 |question|，但排版有区别）
  \item |[points = 10]| 设置分值
  \item |solution| 环境包含解答过程（默认隐藏）
\end{itemize}

\subsubsection{显示解答}

控制解答的显示方式：

\begin{latexcode}
  \examsetup{
    solution/show-solution = show-stay  % 原位显示
    % solution/show-solution = show-move  % 移到试卷最后
    % solution/show-solution = hide       % 隐藏（默认）
  }
\end{latexcode}

\textbf{三种模式：}
\begin{enumerate}
  \item |hide|（默认）：完全隐藏，生成学生版
  \item |show-stay|：在原位显示，适合教师版
  \item |show-move|：移到试卷最后统一显示
\end{enumerate}

\subsubsection{给分点标记}

在解答过程中标记给分点：

\begin{latexcode}
  \begin{solution}
    解：设方程两根为 $x_1$、$x_2$。\score{2}

    由韦达定理得：
    $x_1 + x_2 = 5$ \score{3}

    $x_1 \cdot x_2 = 6$ \score{3}

    解得 $x_1 = 2$，$x_2 = 3$。\score{2}
  \end{solution}
\end{latexcode}

\textbf{说明：}|\score{分数}| 命令标记该步骤的分值，有助于阅卷。

\subsubsection{小问题}

解答题中可以包含多个小问：

\begin{latexcode}
  \begin{problem}[points = 12]
    已知函数 $f(x) = x^2 - 2x + 1$。
    \begin{enumerate}
      \item 求 $f(x)$ 的最小值；\score{5}
      \item 求 $f(x)$ 的对称轴；\score{4}
      \item 画出 $f(x)$ 的图像。\score{3}
    \end{enumerate}

    \begin{solution}
      \begin{enumerate}
        \item 配方得 $f(x) = (x-1)^2$，
              最小值为 $0$。
        \item 对称轴为 $x = 1$。
        \item （图像略）
      \end{enumerate}
    \end{solution}
  \end{problem}
\end{latexcode}


\subsection{其他题型}

\subsubsection{判断题}

判断题使用 |\TF| 或 |\tf| 命令。

\begin{latexcode}
  \begin{question}
    $1 + 1 = 3$。\TF[F]
  \end{question}

  \begin{question}
    圆的面积公式是 $S = \uppi r^2$。\tf[T]
  \end{question}
\end{latexcode}

\textbf{说明：}
\begin{itemize}
  \item |\TF[T]| 或 |\TF[F]| 生成判断括号，答案默认隐藏
  \item |\TF| 大写，括号较大；|\tf| 小写，括号较小
  \item 答案在 |\examsetup{question/show-answer = true}| 时显示
\end{itemize}

\subsubsection{列表题}

一个大题下有多个并列的小问题：

\begin{latexcode}
  \begin{question}
    计算下列各题：
    \begin{enumerate}
      \item $1 + 1 = $ \fillin[2]
      \item $2 + 2 = $ \fillin[4]
      \item $3 + 3 = $ \fillin[6]
    \end{enumerate}
  \end{question}
\end{latexcode}

或使用 |subs| 环境（更紧凑）：

\begin{latexcode}
  \begin{question}
    计算：
    \begin{subs}
      \item $1 + 1 = $ \fillin[2]
      \item $2 + 2 = $ \fillin[4]
    \end{subs}
  \end{question}
\end{latexcode}


\subsection{题号控制}

\subsubsection{自动编号}

题号默认从 1 开始自动递增，无需手动管理。

\subsubsection{重置题号}

在新的题型部分重置题号：

\begin{latexcode}
  \section{一、选择题}
  \begin{question}
    % 题号自动从 1 开始
  \end{question}

  \section{二、填空题}
  \examsetup{question/index = 0}  % 重置题号
  \begin{question}
    % 题号重新从 1 开始
  \end{question}
\end{latexcode}

\subsubsection{手动设置题号}

从指定数字开始：

\begin{latexcode}
  \examsetup{question/index = 10}  % 下一题从 11 开始

  \begin{question}
    这是第 11 题...
  \end{question}
\end{latexcode}

\subsubsection{题号样式}

自定义题号格式：

\begin{latexcode}
  \examsetup{
    question/number-format = \arabic*.,  % 1., 2., 3., ...
    % question/number-format = (\arabic*), % (1), (2), (3), ...
    % question/number-format = \chinese*、 % 一、二、三、...
  }
\end{latexcode}


\subsection{完整示例}

下面是一份包含多种题型的完整试卷示例：

\begin{latexcode}[deletetexcs={\documentclass},morekeywords={\documentclass}]
  \documentclass{exam-zh}

  % 显示答案（教师版）
  % \examsetup{
  %  paren/show-paren = true,
  %  question/show-answer = true,
  %  solution/show-solution = show-stay
  % }

  \begin{document}

  \title{2024年春季期中考试}
  \subject{数学}
  \maketitle

  \information{
    姓名\underline{\hspace{6em}},
    班级\underline{\hspace{6em}}
  }

  \begin{notice}
    \item 本试卷共 3 大题，满分 100 分。
    \item 考试时间 90 分钟。
  \end{notice}

  \vspace{1em}

  \section{一、选择题（每题5分，共10分）}

  \begin{question}
    $1 + 1 = $ \paren[C]
    \begin{choices}
      \item $0$  \item $1$  \item $2$  \item $3$
    \end{choices}
  \end{question}

  \begin{question}
    下列哪个是质数？\paren[B]
    \begin{choices}
      \item $4$  \item $5$  \item $6$  \item $8$
    \end{choices}
  \end{question}

  \section{二、填空题（每题5分，共10分）}
  \examsetup{question/index = 0}

  \begin{question}
    $\uppi \approx$ \fillin[3.14]（保留两位小数）。
  \end{question}

  \begin{question}
    正方形边长5cm，面积是 \fillin[25] $\text{cm}^2$。
  \end{question}

  \section{三、解答题（共10分）}
  \examsetup{question/index = 0}

  \begin{problem}[points = 10]
    计算：$(x + 1)^2$
    \begin{solution}
      解：$(x + 1)^2 = x^2 + 2x + 1$
    \end{solution}
  \end{problem}

  \end{document}
\end{latexcode}

\textbf{使用提示：}
\begin{itemize}
  \item 复制此代码作为模板
  \item 修改标题、科目和题目内容
  \item 注释或取消注释 |\examsetup| 切换学生版/教师版
  \item 参考 \file{examples-basic/} 目录中的更多示例
\end{itemize}
